﻿Imports Commander_Wars.Spieletools
Public Class ObjektRegeln
    Implements ICloneable
    Const Version As Byte = 1
    ''' <summary>
    ''' 
    ''' </summary>
    ''' <param name="neuKriegsnebel"></param>
    ''' <param name="AnzahlderSpieler"></param>
    ''' <param name="neuSiegbedingungen"></param>
    ''' <param name="Zufallswetter"></param>
    ''' <param name="neueWetterwahrscheinlichkeit"></param>
    ''' <param name="StartWetter">Das Wetter zu Begiinn ist Gleichzeitig das Standardwetter</param>
    ''' <param name="neuSpieldauer"></param>
    ''' <param name="Besetzungen"></param>
    ''' <param name="Unbesiegbare"></param>
    ''' <param name="Luftschlacht"></param>
    ''' <remarks></remarks>
    Public Sub New(ByVal neuKriegsnebel As Boolean, ByVal AnzahlderSpieler As Integer, ByVal neuSiegbedingungen() As Siegbedingungen, ByVal Zufallswetter As Boolean, ByVal neueWetterwahrscheinlichkeit() As Integer, Optional ByVal StartWetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne, Optional ByVal neuSpieldauer As Integer = -1, Optional ByVal Besetzungen As Integer = -1, Optional ByVal Unbesiegbare() As Integer = Nothing, Optional ByVal Luftschlacht As Boolean = True)
        If neuKriegsnebel = False Then
            Nebel = Nebelarten.Aus
        Else
            Nebel = Nebelarten.Kriegsnebel
        End If
        Array.Resize(StandartSiegbedingungen, neuSiegbedingungen.Length)
        For I = 0 To neuSiegbedingungen.Length - 1
            StandartSiegbedingungen(I) = neuSiegbedingungen(I)
        Next
        Unbesiegbar = Unbesiegbare
        Wetterwahrscheinlichkeiten = neueWetterwahrscheinlichkeit
        Wetter = StartWetter
        Me.Luftschlacht = Luftschlacht
        Me.Standardwetter = StartWetter
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnaechstenWetterAenderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnaechstenWetterAenderung = AnzahlderSpieler
            End If
        End If

        'Wir sind in einem Netzwerkspiel, also muessen wir entweder das wetter als Host senden, oder als Client empfangen.
        If (Hauptmenue.Connection.Hosten And Hauptmenue.Connection.Connected) Or (Not Hauptmenue.Connection.Connected) Then
            If Objektverwalter.Spielfeld IsNot Nothing Then
                Hauptmenue.NetzBefehlSenden(Wetter)
            End If
        End If

        If neuSpieldauer > 0 Then
            MaximaleSpieldauer = neuSpieldauer
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Zeit
        End If
        If Besetzungen > 0 Then
            AnzahlderBesetzungen = Besetzungen
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Besetzungen
        End If
        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                MenschenZaehlen()
            End If
        End If
    End Sub
    Public Sub New(ByVal AnzahlderSpieler As Integer, ByVal CountHuman As Boolean)
        Nebel = Nebelarten.Aus
        StandartSiegbedingungen = New ObjektRegeln.Siegbedingungen() {ObjektRegeln.Siegbedingungen.KeineHQs, ObjektRegeln.Siegbedingungen.KeineEinheiten}
        Unbesiegbar = Nothing
        Wetterwahrscheinlichkeiten = New Integer() {70, 10, 10, 10}
        Wetter = ObjektSpielfeld.Wetterarten.Sonne
        Me.Luftschlacht = True
        Me.Standardwetter = ObjektSpielfeld.Wetterarten.Sonne
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnaechstenWetterAenderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnaechstenWetterAenderung = AnzahlderSpieler
            End If
        End If

        'Wir sind in einem Netzwerkspiel, also muessen wir entweder das wetter als Host senden, oder als Client empfangen.
        If (Hauptmenue.Connection.Hosten And Hauptmenue.Connection.Connected) Or (Not Hauptmenue.Connection.Connected) Then
            Hauptmenue.NetzBefehlSenden(Wetter)
        End If

        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If CountHuman = True Then
            If IsNothing(Objektverwalter.Spielfeld) = False Then
                If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                    MenschenZaehlen()
                End If
            End If
        End If
    End Sub
    Public Sub New(ByVal neuKriegsnebel As Nebelarten, ByVal AnzahlderSpieler As Integer, ByVal neuSiegbedingungen() As Siegbedingungen, ByVal Zufallswetter As Boolean, ByVal neueWetterwahrscheinlichkeit() As Integer, Optional ByVal StartWetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne, Optional ByVal neuSpieldauer As Integer = -1, Optional ByVal Besetzungen As Integer = -1, Optional ByVal Unbesiegbare() As Integer = Nothing, Optional ByVal Luftschlacht As Boolean = True)
        Nebel = neuKriegsnebel
        Array.Resize(StandartSiegbedingungen, neuSiegbedingungen.Length)
        For I = 0 To neuSiegbedingungen.Length - 1
            StandartSiegbedingungen(I) = neuSiegbedingungen(I)
        Next
        Unbesiegbar = Unbesiegbare
        Wetterwahrscheinlichkeiten = neueWetterwahrscheinlichkeit
        Wetter = StartWetter
        Me.Luftschlacht = Luftschlacht
        Me.Standardwetter = StartWetter
        If Zufallswetter = False Then
            Me.Zufallswetter = Zufallswetter
        Else
            If Wetter = ObjektSpielfeld.Wetterarten.Sonne Then
                AnzahlderRundenBiszurnaechstenWetterAenderung = Zufallszahl(1, AnzahlderSpieler * 2)
            Else
                AnzahlderRundenBiszurnaechstenWetterAenderung = AnzahlderSpieler
            End If
        End If
        If Hauptmenue.Connection IsNot Nothing Then
            'Wir sind in einem Netzwerkspiel, also muessen wir entweder das wetter als Host senden, oder als Client empfangen.
            If (Hauptmenue.Connection.Hosten And Hauptmenue.Connection.Connected) Or (Not Hauptmenue.Connection.Connected) Then
                Hauptmenue.NetzBefehlSenden(Wetter)
            End If
        End If
        If neuSpieldauer > 0 Then
            MaximaleSpieldauer = neuSpieldauer
            Array.Resize(Me.StandartSiegbedingungen, Me.StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Zeit
        End If
        If Besetzungen > 0 Then
            AnzahlderBesetzungen = Besetzungen
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Besetzungen
        End If
        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                MenschenZaehlen()
            End If
        End If
    End Sub
    Public Sub New(ByVal sinfo() As String)
        Dim Unbes() As Integer = Nothing
        If sinfo(10).ToLower <> "nothing" Then
            Unbes = ToIntArry(sinfo(10).Split("_"))
        End If
        StandartSiegbedingungen = ToIntArry(sinfo(4).Split("_"))
        Dim W() As Integer = ToIntArry(sinfo(6).Split("_"))
        Dim LS As Boolean = sinfo(11)
        Dim ZW As Boolean = sinfo(5)
        Dim N As Nebelarten = CInt(sinfo(2))
        Dim ASp As Integer = CInt(sinfo(3))
        Dim SW As ObjektSpielfeld.Wetterarten = CInt(sinfo(7))
        Me.Nebel2 = N
        Dim AnzahlderSpieler As Integer = ASp
        Dim neuSpieldauer As Integer = CInt(sinfo(8))
        If neuSpieldauer > 0 Then
            MaximaleSpieldauer = neuSpieldauer
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Zeit
        End If
        Dim Besetzungen As Integer = CInt(sinfo(9))
        If Besetzungen > 0 Then
            AnzahlderBesetzungen = Besetzungen
            Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
            StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingungen.Besetzungen
        End If

        Me.Zufallswetter = ZW
        Me.Wetterwahrscheinlichkeiten = W
        Me.Standardwetter = SW
        Me.Unbesiegbar = Unbes
        Me.Luftschlacht = LS
        If sinfo.Length > 12 Then Me.Startspieler = sinfo(12)
        If sinfo.Length > 13 Then Me.LevelModus = sinfo(13)
        Dim AlterModus As CommanderWarsGameModi = DataSettings.CommanderWarsGameModus
        If sinfo.Length > 14 Then DataSettings.CommanderWarsGameModus = CInt(sinfo(14))
        If sinfo.Length > 15 Then KOSystem = CInt(sinfo(15))
        Unbesiegbar = Unbes
        If sinfo.Length > 16 Then DoppelGabe = CBool(sinfo(16))
        If sinfo.Length > 17 Then GebaeudeZerstoerung = CBool(sinfo(17))
        If sinfo.Length > 18 Then NoLuck = CBool(sinfo(18))
        If sinfo.Length > 19 Then KeineGebaeudeSchwachstelle = CBool(sinfo(19))
        If sinfo.Length > 20 Then BauBlockade = CBool(sinfo(20))
        If sinfo.Length > 21 Then Teurungsrate = CInt(sinfo(21))
        If sinfo.Length > 22 Then KeineGaben = CBool(sinfo(22))
        If sinfo.Length > 23 Then MaxTroops = CBool(sinfo(23))
        If sinfo.Length > 24 Then Rundenzeit = CLng(sinfo(24))
        If sinfo.Length > 25 Then Timermode = CInt(sinfo(25))
        If sinfo.Length > 26 Then Normalized = CBool(sinfo(26))
        If sinfo.Length > 27 Then Normalized_Terrain = CInt(sinfo(27))
        'Wir setzen nur die Werte auf Null
        ReDim Besiegbar(AnzahlderSpieler, StandartSiegbedingungen.Length - 1)
        Array.Resize(Besiegt, AnzahlderSpieler + 1)
        For I = 0 To AnzahlderSpieler
            Besiegt(I) = False
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = False
            Next
        Next
        If IsNothing(Objektverwalter.Spielfeld) = False Then
            If IsNothing(Objektverwalter.Spielfeld.Spieler) = False Then
                MenschenZaehlen()
            End If
        End If
    End Sub
    Public Sub New(ByRef StrR As Filestream, ByVal Spieler As Integer)
        Dim V As Byte = StrR.ReadByte
        If V >= 1 Then
            Normalized = StrR.ReadByte
        End If
        Nebel2 = StrR.ReadByte
        Dim Ende() As Byte = {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                NebelFelder.Add(New Nebelfeld(0, 0, 0))
                NebelFelder(NebelFelder.Count - 1).Read(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        LevelModus = StrR.ReadByte
        DoppelGabe = StrR.ReadByte
        GebaeudeZerstoerung = StrR.ReadByte
        KeineGaben = StrR.ReadByte
        Wetter = StrR.ReadByte
        Zufallswetter = StrR.ReadByte
        Standardwetter = StrR.ReadByte
        ReDim Wetterwahrscheinlichkeiten([Enum].GetNames(ObjektSpielfeld.Wetterarten.Regen.GetType).Length - 1)
        For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
            Wetterwahrscheinlichkeiten(I) = StrR.ReadByte
        Next
        Dim B(3) As Byte
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        AnzahlderRundenBiszurnaechstenWetterAenderung = BytesToInt(B)
        Luftschlacht = StrR.ReadByte
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        LetzterMensch = BytesToInt(B)
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        Teurungsrate = BytesToInt(B)
        BauBlockade = StrR.ReadByte
        Siegbedingung = ReadString(StrR)
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        Startspieler = BytesToInt(B)
        NoLuck = StrR.ReadByte
        KeineGebaeudeSchwachstelle = StrR.ReadByte
        KOSystem = StrR.ReadByte
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        MaxTroops = BytesToInt(B)
        Unbesiegbar = ReadIntegerArray(StrR)
        Besiegt = ReadBooleanArray(StrR)

        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        MaximaleSpieldauer = BytesToInt(B)
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        AnzahlderBesetzungen = BytesToInt(B)
        For I = 0 To 3
            B(I) = StrR.ReadByte
        Next
        MaxTime = BytesToInt(B)
        ReDim B(7)
        For I = 0 To 7
            B(I) = StrR.ReadByte
        Next
        MaxDeployedUnits = BytesToLong(B)
        Dim Endf As Byte = 0
        While Not (Endf = 254)
            Endf = StrR.ReadByte
            StrR.Seek(-1)
            If Not (Endf = 254) Then
                Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
                StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = StrR.ReadByte
            End If
        End While
        StrR.ReadByte()

        ReDim Besiegbar(Spieler, StandartSiegbedingungen.Count - 1)
        For I = 0 To Besiegbar.GetLength(0) - 1
            For I2 = 0 To StandartSiegbedingungen.Length - 1
                Besiegbar(I, I2) = StrR.ReadByte
            Next
        Next
        StrR.ReadByte()

        Ende = New Byte() {0, 0, 0, 0}
        While Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254)
            Ende(0) = StrR.ReadByte
            Ende(1) = StrR.ReadByte
            Ende(2) = StrR.ReadByte
            Ende(3) = StrR.ReadByte
            StrR.Seek(-4)
            If Not (Ende(0) = 254 And Ende(1) = 254 And Ende(2) = 254 And Ende(3) = 254) Then
                SitutionsSitzung.Add(New ObjektScript.EreignisDialog("", "", 0, 0))
                SitutionsSitzung(SitutionsSitzung.Count - 1).Read(StrR)
            End If
        End While
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
        StrR.ReadByte()
    End Sub
    Public Sub Write(ByRef StrW As Filestream, ByVal Spieler As Integer)
        StrW.WriteByte(Version)
        StrW.WriteByte(Normalized)
        StrW.WriteByte(Nebel2)
        For I = 0 To NebelFelder.Count - 1
            NebelFelder(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(LevelModus)
        StrW.WriteByte(DoppelGabe)
        StrW.WriteByte(GebaeudeZerstoerung)
        StrW.WriteByte(KeineGaben)
        StrW.WriteByte(Wetter)
        StrW.WriteByte(Zufallswetter)
        StrW.WriteByte(Standardwetter)
        For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
            StrW.WriteByte(Wetterwahrscheinlichkeiten(I))
        Next
        Dim B(3) As Byte
        B = IntToBytes(AnzahlderRundenBiszurnaechstenWetterAenderung)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        StrW.WriteByte(Luftschlacht)
        B = IntToBytes(LetzterMensch)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        B = IntToBytes(Teurungsrate)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        StrW.WriteByte(BauBlockade)
        WriteString(StrW, Siegbedingung)
        B = IntToBytes(Startspieler)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        StrW.WriteByte(NoLuck)
        StrW.WriteByte(KeineGebaeudeSchwachstelle)
        StrW.WriteByte(KOSystem)
        B = IntToBytes(MaxTroops)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        If Unbesiegbar Is Nothing Then ReDim Unbesiegbar(-1)
        WriteIntegerArray(StrW, Unbesiegbar)
        WriteBooleanArray(StrW, Besiegt)
        B = IntToBytes(MaximaleSpieldauer)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        B = IntToBytes(AnzahlderBesetzungen)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        B = IntToBytes(MaxTime)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        B = LongToBytes(MaxDeployedUnits)
        For i = 0 To B.Length - 1
            StrW.WriteByte(B(i))
        Next
        For I = 0 To StandartSiegbedingungen.Length - 1
            StrW.WriteByte(StandartSiegbedingungen(I))
        Next
        StrW.WriteByte(254)
        If Besiegbar.GetLength(1) <> StandartSiegbedingungen.Count Or Besiegbar.GetLength(0) > Spieler Or Besiegbar.GetLength(0) < Spieler Then
            Dim B1(,) As Boolean = Besiegbar.Clone
            ReDim Besiegbar(Spieler, StandartSiegbedingungen.Count - 1)
            For I = 0 To Spieler
                For I2 = 0 To StandartSiegbedingungen.Count - 1
                    If B1.GetLength(1) > I2 And B1.GetLength(0) > I Then
                        Besiegbar(I, I2) = B1(I, I2)
                    Else
                        Besiegbar(I, I2) = False
                    End If
                Next
            Next
        End If
        For I = 0 To Besiegbar.GetLength(0) - 1
            For I2 = 0 To StandartSiegbedingungen.Count - 1
                StrW.WriteByte(Besiegbar(I, I2))
            Next
        Next
        StrW.WriteByte(254)
        For I = 0 To SitutionsSitzung.Count - 1
            SitutionsSitzung(I).Write(StrW)
        Next
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
        StrW.WriteByte(254)
    End Sub
    Public Sub MenschenZaehlen()
        AnzahlderMenschen = 0
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch And Besiegt(I) = False Then
                AnzahlderMenschen += 1
            End If
        Next

    End Sub
    ''' <summary>
    ''' Der Dialog fuer die Text Ausgabe im Situationsraum
    ''' Also eine kleine Hilfestellung.
    ''' </summary>
    ''' <remarks></remarks>




#Region "Wetter"

    Public Sub WetterAendern()

        If AnzahlderRundenBiszurnaechstenWetterAenderung > 0 Then
            AnzahlderRundenBiszurnaechstenWetterAenderung -= 1
            If AnzahlderRundenBiszurnaechstenWetterAenderung < 0 Then
                AnzahlderRundenBiszurnaechstenWetterAenderung = 0
            End If
        ElseIf AnzahlderRundenBiszurnaechstenWetterAenderung = 0 Then

            'Bevor wir das Wetter aendern sollten wir aufpassen (Bei einem Netzwerkspiel)

            If (Hauptmenue.Connection.Hosten = False And Hauptmenue.Connection.Connected) Or (Hauptmenue.AufzeichnungAbspielen) Then
                Exit Sub
            End If

            'Wenn wir bis hierher ueberlebt haben, haben wir das recht das Wetter zu aendern.

            If Zufallswetter = True Then
                Dim Zufall As Integer = Zufallszahl(1, 100)
                For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
                    If Zufall <= Wetterwahrscheinlichkeiten(I) Then
                        Wetter = I

                        'Oho wir sind also der Host in einem Netzwerkspiel, der ueber alle anderen Spieler entscheidet.
                        Hauptmenue.NetzBefehlSenden(Wetter)

                        Exit For
                    Else
                        Zufall -= Wetterwahrscheinlichkeiten(I)
                    End If
                Next
            Else
                Wetter = Standardwetter

                'Oho wir sind also der Host in einem Netzwerkspiel, der ueber alle anderen Spieler entscheidet.
                Hauptmenue.NetzBefehlSenden(Wetter)

            End If
            Dim Mitspieler As Integer = 0
            For I = 1 To Besiegt.Length - 1
                If Besiegt(I) = False Then
                    Mitspieler += 1
                End If
            Next
            If Wetter = Standardwetter Then
                AnzahlderRundenBiszurnaechstenWetterAenderung = Zufallszahl(1, Mitspieler * 2)
            Else
                AnzahlderRundenBiszurnaechstenWetterAenderung = Mitspieler - 1 'Ich bin mir nicht sicher aber, beim jetztigen Spieler ist ja schon das Wetter muss es also nicht noch -1 sein.
            End If

        End If
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub
    ''' <summary>
    ''' Das hier wird von Gaben und so aufgerufen. Kann also bei jeden Netzwerkspiel unabhaengig voneinander berechnet werden. Kein Synchronisationsbedarf, soweit ich das hier ueberblicke.
    ''' </summary>
    ''' <param name="Wetter"></param>
    ''' <param name="Dauer"></param>
    ''' <remarks></remarks>
    Public Sub WetterAendern(ByVal Wetter As ObjektSpielfeld.Wetterarten, ByVal Dauer As Integer)
        Me.Wetter = Wetter
        Dim Mitspieler As Integer = 0
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) = False Then
                Mitspieler += 1
            End If
        Next
        AnzahlderRundenBiszurnaechstenWetterAenderung = Mitspieler * Dauer - 1 'Ich bin mir nicht sicher aber, beim jetztigen Spieler ist ja schon das Wetter muss es also nicht noch -1 sein.
        Objektverwalter.Spielfeld.Sichterstellen()
    End Sub
    ''' <summary>
    ''' Berechnet das wahrscheinliche Wetter bei Spieler N
    ''' </summary>
    ''' <param name="Spieler"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetWetterBeiSpieler(ByVal Spieler As Integer) As ObjektSpielfeld.Wetterarten
        If AnzahlderRundenBiszurnaechstenWetterAenderung > 0 Then
            If Spieler > 0 Then
                Dim RundenZumSpieler As Integer = 0
                If Spieler > Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                    For I = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler + 1 To Spieler
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                Else
                    For I = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler + 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                    For I = 1 To Spieler
                        If Besiegt(I) = False Then
                            RundenZumSpieler += 1
                        End If
                    Next
                End If
                If RundenZumSpieler < AnzahlderRundenBiszurnaechstenWetterAenderung Then
                    Return Wetter
                Else
                    Return Standardwetter
                End If
            Else
                Return Wetter
            End If
        Else 'Wir haben kein Zufallswetter
            Return Wetter
        End If
    End Function
#End Region



#Region "Variablen"
    Public Wetterwahrscheinlichkeiten() As Integer = {}
    ''' <summary>
    ''' Auf das Wetter kann man gerne zugreifen, aber wenn man das Wetter setzten will, sollte man den anderen Netzwerkspielern bescheid geben.
    ''' </summary>
    ''' <remarks></remarks>
    Public Wetter As ObjektSpielfeld.Wetterarten

    Public AnzahlderRundenBiszurnaechstenWetterAenderung As Integer = 0
    Public Zufallswetter As Boolean = True
    Public Standardwetter As ObjektSpielfeld.Wetterarten = ObjektSpielfeld.Wetterarten.Sonne
    Public SitutionsSitzung As New List(Of ObjektScript.EreignisDialog)
    Public Besiegbar(,) As Boolean = {}
    Public StandartSiegbedingungen() As Siegbedingungen = {}
#Region "Rang Informationen"
    Public MaxTime As Integer = -1
    Public MaxDeployedUnits As Int64 = -1
#End Region
    ''' <summary>
    ''' The Maximum Number of Troops for each Army.
    ''' </summary>
    ''' <remarks></remarks>
    Public MaxTroops As Integer = -1
    Public Unbesiegbar() As Integer
    Dim MaximaleSpieldauer As Integer = -1
    Public ReadOnly Property MaxSpieldauer() As Integer
        Get
            Return MaximaleSpieldauer
        End Get
    End Property
    Dim AnzahlderBesetzungen As Integer = -1
    Public ReadOnly Property MaximaleanzahlderBesetzungen() As Integer
        Get
            Return AnzahlderBesetzungen
        End Get
    End Property
    Public Besiegt() As Boolean = {}
    Public Startspieler As Integer = 1
    ''' <summary>
    ''' Wenn True verwenden wir kein Glueck.
    ''' </summary>
    ''' <remarks></remarks>
    Public NoLuck As Boolean = False
    ''' <summary>
    ''' Wenn True kann man das gesamte Gebaeude angreifen.
    ''' </summary>
    ''' <remarks></remarks>
    Public KeineGebaeudeSchwachstelle As Boolean = False
    ''' <summary>
    ''' Welches Ko-System wir verwenden.
    ''' </summary>
    ''' <remarks></remarks>
    Public KOSystem As KOSysteme = KOSysteme.Gabe_Modus
    Public AnzahlderMenschen As Integer
    Public Rundenzeit As Long
    Public Timermode As Timer.Timemodus
    Public KeineGaben As Boolean = False
    Public Luftschlacht As Boolean = False
    Public LetzterMensch As Integer = 0
    ''' <summary>
    ''' Fuer jede Einheit steigt der Einheitenpreis um diesen Wert
    ''' </summary>
    ''' <remarks></remarks>
    Public Teurungsrate As Integer = 0
    ''' <summary>
    ''' Haben wir eine Baublockade
    ''' </summary>
    ''' <remarks></remarks>
    Public BauBlockade As Boolean = False
    ''' <summary>
    ''' Siegbedingung fuer diese Karte fuer die Ausgabe
    ''' </summary>
    ''' <remarks></remarks>
    Public Siegbedingung As String = ""
    Dim Nebel2 As Nebelarten = Nebelarten.Aus
    Public Property Nebel() As Nebelarten
        Get
            Select Case DataSettings.CommanderWarsGameModus
                Case CommanderWarsGameModi.AdvanceWarsDS
                    If Wetter = ObjektSpielfeld.Wetterarten.Regen Then
                        Return Nebelarten.Kriegsnebel
                    Else
                        Return Nebel2
                    End If
                Case Else
                    Return Nebel2
            End Select
        End Get
        Set(ByVal value As Nebelarten)
            Nebel2 = value
        End Set
    End Property
    Public NebelFelder As New List(Of Nebelfeld)
    Public Class Nebelfeld
        Implements ICloneable

        Const Version As Byte = 0
        Public Nebel As Nebelarten = Nebelarten.Aus
        Public X As Integer
        Public Y As Integer
        Public SetByScript As Boolean
        Public Spieler As Integer
        Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Nebel As Nebelarten, Optional ByVal SetByScript As Boolean = False, Optional ByVal Spieler As Integer = -1)
            Me.X = X
            Me.Y = Y
            Me.Nebel = Nebel
            Me.SetByScript = SetByScript
            Me.Spieler = Spieler
        End Sub
        Public Sub Write(ByRef StrW As Filestream)
            StrW.WriteByte(Version)
            StrW.WriteByte(Nebel)
            StrW.WriteByte(SetByScript)
            Dim B(3) As Byte
            B = IntToBytes(X)
            For i = 0 To B.Length - 1
                StrW.WriteByte(B(i))
            Next
            B = IntToBytes(Y)
            For i = 0 To B.Length - 1
                StrW.WriteByte(B(i))
            Next
            B = IntToBytes(Spieler)
            For i = 0 To B.Length - 1
                StrW.WriteByte(B(i))
            Next
        End Sub
        Public Sub Read(ByRef StrR As Filestream)
            Dim V As Byte = StrR.ReadByte
            Nebel = StrR.ReadByte
            SetByScript = StrR.ReadByte
            Dim B(3) As Byte
            For i = 0 To B.Length - 1
                B(i) = StrR.ReadByte
            Next
            X = BytesToInt(B)
            For i = 0 To B.Length - 1
                B(i) = StrR.ReadByte
            Next
            Y = BytesToInt(B)
            For i = 0 To B.Length - 1
                B(i) = StrR.ReadByte
            Next
            Spieler = BytesToInt(B)
        End Sub

        Public Function Clone() As Object Implements System.ICloneable.Clone
            Return MemberwiseClone()
        End Function
    End Class
    Public Function ContainsNebelfeld(ByVal X As Integer, ByVal Y As Integer, ByVal Spieler As Integer) As Integer
        If NebelFelder IsNot Nothing Then
            For I = 0 To NebelFelder.Count - 1
                If NebelFelder(I).X = X Then
                    If NebelFelder(I).Y = Y Then
                        If Spieler = NebelFelder(I).Spieler Or NebelFelder(I).Spieler <= 0 Then
                            Return I
                        End If
                    End If
                End If
            Next
        End If
        Return -1
    End Function
    ''' <summary>
    ''' Wenn true koennen Einheitenstaerker werden, wenn sie Feinde vernichten.
    ''' </summary>
    ''' <remarks></remarks>
    Public LevelModus As Boolean = True
    ''' <summary>
    ''' Erlaubt oder verbietet den Einsatz der Doppelgabe.
    ''' </summary>
    ''' <remarks></remarks>
    Public DoppelGabe As Boolean = True
    ''' <summary>
    ''' Wenn True koennen Gebaeude Einheiten zerstoeren.
    ''' </summary>
    ''' <remarks></remarks>
    Public GebaeudeZerstoerung As Boolean = False
    ''' <summary>
    ''' Wenn true wird zu Beginn des Spiels allen Spielern die Gabeleiste geklaut.
    ''' </summary>
    ''' <remarks></remarks>
    Public Spielende As Boolean = False
    ''' <summary>
    ''' Wenn True haben wir nur ein Terrain auf der Karte
    ''' </summary>
    ''' <remarks></remarks>
    Public Normalized As Boolean = False
    ''' <summary>
    ''' Das Terrain was auf die Karte angewendet wird.
    ''' </summary>
    ''' <remarks></remarks>
    Public Normalized_Terrain As Normalized_Terrains = Normalized_Terrains.Keine
    Public Enum Normalized_Terrains
        Keine
        Normal
        Schnee
        Wueste
    End Enum
#End Region
#Region "Gewinnen"

    Enum Siegbedingungen
        KeineHQs
        KeineEinheiten
        KeineBesetzungen
        Zeit
        Besetzungen
    End Enum
    Public Function CheckSieg() As Boolean
        If Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade IsNot Nothing Then
            Objektverwalter.Spielfeld.AktuellerSpieler.SpielerBaublockade.UpdateValues()
        End If

        If Besiegt.Length > Objektverwalter.Spielfeld.Spieler.Length Then
            Array.Resize(Besiegt, Objektverwalter.Spielfeld.Spieler.Length)
        End If
        SindBesiegbar()


        If IsNothing(StandartSiegbedingungen) = False Then
            IstBesiegt()
        End If
        NeutralMachen()
        If CountTeams() = 1 Then
            'Ein Team hat gewonnen
            Spielende = True
        Else
            MenschenZaehlen()
        End If
    End Function
    ''' <summary>
    ''' Ueberprueft welche Spieler noch mit Spielen duerfen und loescht gegebenenfalls andere Spieler
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub IstBesiegt()
        Dim AnzahlderEinheiten() As Integer = {}
        Dim AnzahlderHQs() As Integer = {}
        Array.Resize(AnzahlderEinheiten, Besiegt.Length)
        Array.Resize(AnzahlderHQs, Besiegt.Length)
        Dim Max As Integer = 0
        If Luftschlacht = True Then
            Max = 1
        End If
        For I = 0 To Max
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If Not Objektverwalter.Spielfeld.Landschaften(X, Y, I).Hidden Then
                        If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                            AnzahlderEinheiten(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler) += 1
                        End If
                        If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                            If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Angriff = ObjektGebaeude.Angriffe.HQ Then
                                AnzahlderHQs(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler) += 1
                            End If
                        End If
                    End If
                Next
            Next
        Next
        If Not Objektverwalter.Spielfeld.AktuelleEinheit Is Nothing Then
            If Objektverwalter.Spielfeld.AktuelleEinheit.Leben > 0 Then
                AnzahlderEinheiten(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler) += 1
            End If
        End If
        For I = 0 To StandartSiegbedingungen.Length - 1
            Select Case StandartSiegbedingungen(I)
                Case Siegbedingungen.Besetzungen
                    For I2 = 1 To AnzahlderEinheiten.Length - 1
                        If Objektverwalter.Spielfeld.Spieler(I2).CountBuildings >= AnzahlderBesetzungen Then
                            For I3 = 1 To AnzahlderEinheiten.Length - 1
                                If Objektverwalter.Spielfeld.Spieler(I3).Team <> Objektverwalter.Spielfeld.Spieler(I2).Team Then
                                    If IsNothing(Unbesiegbar) = False Then
                                        If Array.IndexOf(Unbesiegbar, I3) < 0 Then
                                            Besiegt(I3) = True
                                        End If
                                    Else
                                        Besiegt(I3) = True
                                    End If
                                Else
                                    Besiegt(I3) = False
                                End If
                            Next
                        End If
                    Next
                Case Siegbedingungen.KeineBesetzungen
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If Objektverwalter.Spielfeld.Spieler(I2).GetGebaeude(ObjektSpieler.Gebaeudesuche.Fonds) <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineBesetzungen)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        Besiegt(I2) = True
                                    End If
                                Else
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.KeineEinheiten
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If AnzahlderEinheiten(I2) <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineEinheiten)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        Besiegt(I2) = True
                                    End If
                                Else
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.KeineHQs
                    For I2 = 0 To AnzahlderEinheiten.Length - 1
                        If AnzahlderHQs(I2) <= 0 Then
                            If Besiegbar(I2, Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineHQs)) = True Then
                                If IsNothing(Unbesiegbar) = False Then
                                    If Array.IndexOf(Unbesiegbar, I2) < 0 Then
                                        If Besiegt(I2) = False Then
                                            Select Case DataSettings.CommanderWarsGameModus
                                                Case CommanderWarsGameModi.CommanderWars
                                                Case CommanderWarsGameModi.CommanderWars2
                                                Case Else
                                                    Uebernehmen(I2)
                                            End Select
                                            Besiegt(I2) = True
                                        End If
                                    End If
                                ElseIf Besiegt(I2) = False Then
                                    Select Case DataSettings.CommanderWarsGameModus
                                        Case CommanderWarsGameModi.CommanderWars
                                        Case CommanderWarsGameModi.CommanderWars2
                                        Case Else
                                            Uebernehmen(I2)
                                    End Select
                                    Besiegt(I2) = True
                                End If
                            End If
                        End If
                    Next
                Case Siegbedingungen.Zeit
                    If Objektverwalter.Spielfeld.Runde >= MaximaleSpieldauer Then
                        'Jetzt muessen wir ermitteln wer gewonnen
                        Dim Siegspieler As Integer = -1
                        Dim Siegbesetzungen As Integer = -1
                        For I2 = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
                            Dim Bes As Integer = Objektverwalter.Spielfeld.Spieler(I2).CountBuildings
                            If Bes > Siegbesetzungen Then
                                Siegspieler = I2
                                Siegbesetzungen = Bes
                            ElseIf Bes = Siegbesetzungen And Siegbesetzungen >= 0 Then
                                Siegspieler = -1
                            End If
                        Next
                        If Siegspieler > 0 Then
                            For I3 = 1 To AnzahlderEinheiten.Length - 1
                                If Objektverwalter.Spielfeld.Spieler(I3).Team <> Objektverwalter.Spielfeld.Spieler(Siegspieler).Team Then
                                    If IsNothing(Unbesiegbar) = False Then
                                        If Array.IndexOf(Unbesiegbar, I3) < 0 Then
                                            Besiegt(I3) = True
                                        End If
                                    Else
                                        Besiegt(I3) = True
                                    End If
                                Else
                                    Besiegt(I3) = False
                                End If
                            Next
                        End If
                    End If
            End Select
        Next
    End Sub
    Public Function IstBesiegt(ByVal Spieler As Integer) As Boolean
        Return Besiegt(Spieler)
    End Function
    Public Sub SindBesiegbar()
        Dim AnzahlderEinheiten() As Integer = {}
        Dim AnzahlderGebaeude() As Integer = {}
        Dim AnzahlderHQs() As Integer = {}
        Array.Resize(AnzahlderEinheiten, Besiegt.Length)
        Array.Resize(AnzahlderGebaeude, Besiegt.Length)
        Array.Resize(AnzahlderHQs, Besiegt.Length)
        If Besiegbar.GetLength(0) > Besiegt.Length Or Besiegbar.GetLength(0) < Besiegt.Length Then
            Dim R(Besiegt.Length - 1, Besiegbar.GetLength(1) - 1) As Boolean
            For I = 0 To Besiegt.Length - 1
                For I2 = 0 To Besiegbar.GetLength(1) - 1
                    R(I, I2) = Besiegbar(I, I2)
                Next
            Next
            Besiegbar = R
        End If
        Dim Max As Integer = 0
        If Luftschlacht = True Then
            Max = 1
        End If
        For I = 0 To Max
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    If IsNothing(Objektverwalter.Spielfeld.Einheiten(X, Y, I)) = False Then
                        AnzahlderEinheiten(Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler) += 1
                    End If
                    If IsNothing(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude) = False Then
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.getFonds = True Then
                            AnzahlderGebaeude(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler) += 1
                        End If
                        If Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Angriff = ObjektGebaeude.Angriffe.HQ Then
                            AnzahlderHQs(Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude.Spieler) += 1
                        End If
                    End If
                Next
            Next
        Next
        'Nun wird der Wert festgesetzt
        For I = 1 To Besiegbar.GetLength(0) - 1
            Dim Stelle As Integer = Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineEinheiten)
            If Stelle >= 0 Then
                If Besiegbar(I, Stelle) = False Then
                    If AnzahlderEinheiten(I) > 0 Then
                        Besiegbar(I, Stelle) = True
                    End If
                End If
            End If
            Stelle = Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineHQs)
            If Stelle >= 0 Then

                If AnzahlderHQs(I) > 0 Then
                    Besiegbar(I, Stelle) = True
                End If
            End If
            Stelle = (Array.IndexOf(StandartSiegbedingungen, Siegbedingungen.KeineBesetzungen))
            If Stelle >= 0 Then
                If Besiegbar(I, Stelle) = False Then
                    If AnzahlderGebaeude(I) > 0 Then
                        Besiegbar(I, Stelle) = True
                    End If
                End If
            End If
            If IsNothing(Unbesiegbar) = False Then
                If Unbesiegbar.Length > 0 Then
                    If Array.IndexOf(Unbesiegbar, I) >= 0 Then
                        For I2 = 0 To StandartSiegbedingungen.Length - 1
                            Besiegbar(I, I2) = False
                        Next
                    End If
                End If
            End If
        Next
        'Geschlossene Spieler verlieren!
        For I = 1 To Objektverwalter.Spielfeld.Spieler.Length - 1
            If Objektverwalter.Spielfeld.Spieler(I).KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                Besiegt(I) = True
            End If
        Next
    End Sub
    Private Function CountTeams() As Integer
        Dim Teams As Integer = 0
        Dim ErfassteTeams() As Char = {}
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) = False Then
                If Array.IndexOf(ErfassteTeams, Objektverwalter.Spielfeld.Spieler(I).Team) < 0 Then
                    Teams += 1
                    Array.Resize(ErfassteTeams, ErfassteTeams.Length + 1)
                    ErfassteTeams(ErfassteTeams.Length - 1) = Objektverwalter.Spielfeld.Spieler(I).Team
                End If
            End If
        Next
        Return Teams
    End Function
    Public Sub SiegBedingungHinzufuegen(ByVal Siegbedingung As Siegbedingungen, ByVal Spieler As Integer, Optional ByVal TageBes As Integer = -1)
        For I = 0 To StandartSiegbedingungen.Length - 1
            If StandartSiegbedingungen(I) = Siegbedingung Then
                Exit Sub
            End If
        Next

        Array.Resize(StandartSiegbedingungen, StandartSiegbedingungen.Length + 1)
        StandartSiegbedingungen(StandartSiegbedingungen.Length - 1) = Siegbedingung

        ReDim Besiegbar(Spieler, StandartSiegbedingungen.Length - 1)
        Select Case Siegbedingung
            Case Siegbedingungen.KeineBesetzungen

            Case Siegbedingungen.KeineEinheiten

            Case Siegbedingungen.KeineHQs

            Case Siegbedingungen.Besetzungen
                AnzahlderBesetzungen = TageBes
            Case Siegbedingungen.Zeit
                MaximaleSpieldauer = TageBes
        End Select
    End Sub
    Public Sub AddUnbesiegbar(ByVal Spieler As Integer)
        If Unbesiegbar Is Nothing Then
            Array.Resize(Unbesiegbar, 1)
        Else
            Array.Resize(Unbesiegbar, Unbesiegbar.Length + 1)
        End If
        Unbesiegbar(Unbesiegbar.Length - 1) = Spieler
    End Sub
    Private Sub NeutralMachen()
        Dim B As Integer() = {}
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) Then
                Array.Resize(B, B.Length + 1)
                B(B.Length - 1) = I
            End If
        Next
        Dim Schlacht As Integer = 0
        If Luftschlacht Then Schlacht += 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                    If Not G Is Nothing Then
                        If G.Besetzung > 0 Then
                            If B.Contains(G.Spieler) Then
                                G.Spieler = 0
                                G.getBildID(Objektverwalter.Spielfeld)
                            End If
                        End If
                    End If
                    If DataSettings.CommanderWarsGameModus <> CommanderWarsGameModi.CommanderWars Then
                        Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                        If E IsNot Nothing Then
                            If B.Contains(E.Spieler) Then
                                Objektverwalter.NeuObjektAnimation(X, Y, I)
                            End If
                        End If
                    End If
                Next
            Next
        Next
    End Sub
    ''' <summary>
    ''' Uebernimmt alle feindliche Einheiten.
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub Uebernehmen(ByVal Spieler As Integer)
        Dim Schlacht As Integer = 0
        If Luftschlacht Then Schlacht += 1
        For I = 0 To Schlacht
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Hoehe - 1
                    Select Case DataSettings.CommanderWarsGameModus
                        Case CommanderWarsGameModi.CommanderWars
                        Case CommanderWarsGameModi.CommanderWars2
                        Case Else
                            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, I)
                            If E IsNot Nothing Then
                                If E.Spieler = Spieler Then
                                    Objektverwalter.NeuObjektAnimation(X, Y, I)
                                End If
                            End If
                            Dim G As ObjektGebaeude = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebaeude
                            If Not G Is Nothing Then
                                If G.Besetzung > 0 Then
                                    If G.Spieler = Spieler Then
                                        G.Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler
                                        G.getBildID(Objektverwalter.Spielfeld)
                                        If Objektverwalter.Spielfeld.Einheiten(X, Y, I) IsNot Nothing Then
                                            If Objektverwalter.Spielfeld.Einheiten(X, Y, I).Spieler = Objektverwalter.Spielfeld.AktuellerSpieler.Spieler Then
                                                Objektverwalter.Spielfeld.Einheiten(X, Y, I).Besetzen = False
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                    End Select
                Next
            Next
        Next
    End Sub
#End Region
    ''' <summary>
    ''' Klont die kompletten Regeln.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim R As ObjektRegeln = MemberwiseClone()
        ReDim R.Wetterwahrscheinlichkeiten(Wetterwahrscheinlichkeiten.Length - 1)
        For I = 0 To Wetterwahrscheinlichkeiten.Length - 1
            R.Wetterwahrscheinlichkeiten(I) = Wetterwahrscheinlichkeiten(I)
        Next
        If Unbesiegbar IsNot Nothing Then
            ReDim R.Unbesiegbar(Unbesiegbar.Length - 1)
            For I = 0 To Unbesiegbar.Length - 1
                R.Unbesiegbar(I) = Unbesiegbar(I)
            Next
        End If
        ReDim R.Besiegt(Besiegt.Length - 1)
        For I = 0 To Besiegt.Length - 1
            R.Besiegt(I) = Besiegt(I)
        Next
        ReDim R.StandartSiegbedingungen(StandartSiegbedingungen.Length - 1)
        For I = 0 To StandartSiegbedingungen.Length - 1
            R.StandartSiegbedingungen(I) = StandartSiegbedingungen(I)
        Next
        R.SitutionsSitzung.Clear()
        For I = 0 To SitutionsSitzung.Count - 1
            R.SitutionsSitzung.Add(SitutionsSitzung(I).Clone)
        Next
        R.NebelFelder.Clear()
        For I = 0 To NebelFelder.Count - 1
            R.NebelFelder.Add(NebelFelder(I).Clone)
        Next
        ReDim R.Besiegbar(Besiegbar.GetLength(0) - 1, Besiegbar.GetLength(1) - 1)
        For I = 0 To Besiegbar.GetLength(0) - 1
            For I2 = 0 To Besiegbar.GetLength(1) - 1
                R.Besiegbar(I, I2) = Besiegbar(I, I2)
            Next
        Next
        Return R
    End Function
    Public Function GetFirstPlayer() As Integer
        For I = 1 To Besiegt.Length - 1
            If Besiegt(I) = False Then
                Return I
            End If
        Next
        Return 0
    End Function
#Region "Regeln Senden"
    Public Function GetStandartSiegbedingungen() As String
        Dim S As String = ""
        For i = 0 To StandartSiegbedingungen.Length - 1
            If i = StandartSiegbedingungen.Length - 1 Then
                S += CInt(StandartSiegbedingungen(i)).ToString
            Else
                S += CInt(StandartSiegbedingungen(i)).ToString + "_"
            End If
        Next
        Return S
    End Function
    Public Function GetWetterwahrscheinlichkeiten() As String
        Dim S As String = ""
        For i = 0 To Wetterwahrscheinlichkeiten.Length - 1
            If i = Wetterwahrscheinlichkeiten.Length - 1 Then
                S += CInt(Wetterwahrscheinlichkeiten(i)).ToString
            Else
                S += CInt(Wetterwahrscheinlichkeiten(i)).ToString + "_"
            End If
        Next
        Return S
    End Function
    Public Overrides Function ToString() As String
        Dim S As String = ""
        Dim Unbes As String = ""
        If Unbesiegbar IsNot Nothing Then
            If Unbesiegbar.Length > 0 Then
                For I = 0 To Unbesiegbar.Length - 1
                    If I < Unbesiegbar.Length - 1 Then
                        Unbes += Unbesiegbar(I).ToString + "_"
                    Else
                        Unbes += Unbesiegbar(I).ToString
                    End If
                Next
            Else
                Unbes = "Nothing"
            End If
        Else
            Unbes = "Nothing"
        End If
        S = "Vorbereitung|Regeln|" + CInt(Nebel).ToString + "|" + (Besiegt.Length - 1).ToString + "|" + GetStandartSiegbedingungen() + "|" + Zufallswetter.ToString + "|" + GetWetterwahrscheinlichkeiten() + "|" + CInt(Wetter).ToString + "|" + MaxSpieldauer.ToString + "|" + MaximaleanzahlderBesetzungen.ToString + "|" + _
            Unbes + "|" + Luftschlacht.ToString + "|" + Startspieler.ToString + "|" + LevelModus.ToString + "|" + CInt(DataSettings.CommanderWarsGameModus).ToString + "|" + CInt(KOSystem).ToString + "|" + (DoppelGabe).ToString + "|" + GebaeudeZerstoerung.ToString + "|" + NoLuck.ToString + "|" + _
            KeineGebaeudeSchwachstelle.ToString + "|" + BauBlockade.ToString + "|" + Teurungsrate.ToString + "|" + KeineGaben.ToString + "|" + MaxTroops.ToString + "|" + Rundenzeit.ToString + "|" + CInt(Timermode).ToString + "|" + CInt(Normalized).ToString + "|" + CInt(Normalized_Terrain).ToString
        Return S
    End Function
#End Region

End Class
